import pandas as pd
import numpy as np


def ourpreprocess(temp_arr):
    no=temp_arr.shape[1]
    DSIZE=temp_arr.shape[0]
    for num in range(0,no):
        value=temp_arr[:,num]
        npArray=dataPreprocess(value,DSIZE)
        temp_arr[:, num]=npArray
    return temp_arr

def dataPreprocess(npArray,DSIZE):
    # 缺失值处理
    # 保存缺失值矩阵 false为缺失值
    missingValue=pd.notna(npArray)
    print(missingValue)

    # 存在缺失值，进行缺失值填充
    if(pd.isna(npArray).sum()>0):
        # 以下两种方法2选1
        # 进行缺失值填充
        npArray[np.isnan(npArray)]=0.0

        # 进行缺失值删除 --备选项
        # npArray=npArray[~np.isnan(npArray)]

    # 百分比离群点检测
    npArray=percent_range(npArray,DSIZE,0.025,0.975)
    # 正则化处理

    # min-max标准化   离差标准化，是对原始数据的线性变换，使结果值映射到[0 - 1]之间
    # npArray = [(x - min(npArray)) / (max(npArray) - min(npArray)) for x in npArray]


    # Z-score标准化方法 --备选项   给予原始数据的均值（mean）和标准差（standard deviation）进行数据的标准化。经过处理的数据符合标准正态分布，即均值为0，标准差为1
    # # 均值
    # average = float(sum(npArray)) / len(npArray)
    # # 方差
    # total = 0
    # for value in npArray:
    #     total += (value - average) ** 2
    # stddev = math.sqrt(total / len(npArray))
    # # z-score标准化方法
    # npArray = [(x - average) / stddev for x in npArray]

    # 均值归一化
    # # 均值
    # average = float(sum(npArray)) / len(npArray)
    # # 以max为分母的归一化方法
    # npArray = [(x - average) / max(npArray) for x in npArray]
    # # 以max-min为分母的归一化方法
    # npArray = [(x - average) / (max(npArray) - min(npArray)) for x in npArray]

    # log函数转换方法
    # # log2函数转换
    # npArray = [math.log2(x) for x in npArray]
    # # log10函数转换
    # npArray = [math.log10(x) for x in npArray]

    # atan函数转换方法
    # # atan函数转换方法
    # npArray = [math.atan(x) for x in npArray]

    return npArray

# 百分位法:原始参数 min=0.025， max=0.975
def percent_range(dataset,DSIZE, min=0.20, max=0.80):
    range_max = np.percentile(dataset, max * 100)
    range_min = -np.percentile(-dataset, (1 - min) * 100)

    result=np.empty((DSIZE,))
    i=0
    for value in dataset:
        if value < range_max and value > range_min:
            result[i]=dataset[i]
        else:
            result[i]=-1

        i+=1
    return result
